package cn.jly.bigdata.spark.core

import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext}

/**
 * @author lanyangji
 * @date 2019/11/24 10:47
 */
object Spark01_RDD {

  def main(args: Array[String]): Unit = {

    // local模式

    // 创建 SparkConf 对象
    // 这边也自定义了本地的模式（分配多少个cpu）
    // app id
    val sparkConf: SparkConf = new SparkConf().setMaster("local[*]").setAppName("wordCount")

    // 创建spark上下文对象，SparkContext -> sc
    val sc = new SparkContext(sparkConf)

    // 创建RDD
    // 1. 从内存中创建 makeRDD，底层也调用了parallelize，makeRDD好记，更常用
    // 使用自定义2个分区
    val listRDD: RDD[Int] = sc.makeRDD(List(1, 2, 3, 4),2)

    // 2. 从内存中创建 parallelize，和第一种方式没啥本质区别
    val listParaRDD: RDD[Int] = sc.parallelize(List(1, 2, 3, 4))

    //listParaRDD.collect().foreach(println)

    // 3. 从外部文件系统中创建
    // 默认的情况下，可以读取项目路径，也可以读取其他的路径，包括 HDFS，HBase
    // 默认从文件中读取的数据是字符串类型
    // 读取文件时，传入的分区参数是最小分区数，但是不一定是这个分区数，具体取决于hadoop读取文件时的分片规则
    // 本例子中 输入 word.txt -> 12345，5个数 5/2=2--1， 分区为 2 2 1
    // 但是计算分区和实际写数据是两个操作，这也是取决于hadoop的分片规则，hadoop读取文件是按行读取
    val fileRDD: RDD[String] = sc.textFile("input", 2)
    // val fileRDD: RDD[String] = sc.textFile("file:///d:/words.txt", 2)
    fileRDD.collect().foreach(println)

    // 将RDD的数据保存到文件中
    //fileRDD.saveAsTextFile("output")
  }
}
